Copy-on-write (COW) is an optimization strategy used in computer programming. Multiple requestors of resources that are initially indistinguishable are given pointers to the same resource. This strategy is maintained until a requestor attempts to modify its copy of the resource. A private copy is then created to prevent any changes from becoming visible to the other requestors. The creation of such private copies is transparent to the requestors. No private copy is created if a requestor does not attempt to modify its copy of the resource.
Virtual memory operating systems may use COW. If a process creates a copy of itself, pages in memory that may be modified by the process (or its copy) are marked COW. If one process modifies the memory, the operating system's kernel may intercept the operation and copy the memory so that changes in one process's memory are not visible to the other.
COW may also be used in the calloc function provided in the C and C++ standard libraries for performing dynamic memory allocation. A page of physical memory, for example, may be filled with zeroes. If the memory is allocated, the pages returned may all refer to the page of zeroes and may be marked as COW. As such, the amount of physical memory allocated for a process does not increase until data is written.
A memory management unit (MMU) may be instructed to treat certain pages in an address space of a process as read-only in order to implement COW. If data is written to these pages, the MMU may raise an exception to be handled by a kernel. The kernel may then allocate new space in physical memory and make the page being written correspond to that new location in physical memory.
COW may permit efficient use of memory. Physical memory usage only increases as data is stored in it. Hash tables may be implemented that use little more physical memory than is necessary to store the objects they contain. Such programs, however, may run out of virtual address space because virtual pages unused by the hash table cannot be used by other parts of the program.
Outside a kernel, COW may be used in library, application and system code. For example, the string class provided by the C++ standard library allows COW implementations. COW may also be used in virtualization/emulation software such as Bochs, QEMU and UML for virtual disk storage. This may (i) reduce required disk space as multiple virtual machines (VMs) may be based on the same hard disk image and (ii) increase performance as disk reads may be cached in RAM and subsequent reads served to other VMs outside of the cache.
COW may be used in the maintenance of instant snapshots on database servers. Instant snapshots preserve a static view of a database by storing a pre-modification copy of data when underlying data are updated. Instant snapshots are used for testing or moment-dependent reports and are not generally used to replace backups. COW may also be used as the underlying mechanism for snapshots provided by logical volume management.
COW may be used to emulate a read-write storage on media that require wear leveling or are physically Write Once Read Many.